package com.superlistaportable.productList;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map.Entry;

public class ProductListModel {
    List<String> listDataHeader;
    HashMap<String, List<String>> listDataChild;
    HashMap<String, Float> itemCost = new HashMap<String, Float>();
    HashMap<String, Integer> itemStock = new HashMap<String, Integer>();
    
    public ProductListModel(){
    	loadListDataFrom(savedList());
    }
    
    public void reloadList(){
    	loadListDataFrom(getListFromServer());
    }

	public List<String> getItemsWithStock(){
		ArrayList<String> itemsWithStock = new ArrayList<String>();
		for(Entry<String, Integer>  entry: itemStock.entrySet()){
    		if(entry.getValue() > 0){
    			itemsWithStock.add(entry.getKey());
    		}
		}
		return itemsWithStock;
	}
	
	public float[] getTotals() {
		List<String> itemsWithStock = getItemsWithStock();
		float[] totals = new float[itemsWithStock.size()];
		for(int i = 0; i < itemsWithStock.size(); i++){
			totals[i] = totalCostOf(itemsWithStock.get(i)); 
		}
		return totals;
	}


    private void loadListDataFrom(HashMap<String, List<String>> updates) {
    	//TEMPORAL
    	//cargar la lista de algun lado y llamar a reloadList..
    	
        listDataHeader = new ArrayList<String>();
        listDataChild = new HashMap<String, List<String>>();
 
		for(String key : updates.keySet()){
			listDataHeader.add(key);
		}
		
		for(Entry<String, List<String>> entry : updates.entrySet()){
			listDataChild.put(entry.getKey(), entry.getValue());
		}
		
		buildItemStockMap();

    }
    
	private void buildItemStockMap() {
		this.itemStock = new HashMap<String, Integer>();
        for (String s : listDataHeader) {
        	for(String c: listDataChild.get(s)){
        		this.itemStock.put(c, 0);
        	}
		}
	}
    
	private HashMap<String, List<String>> savedList() {
		//TEMPORAL, cargar desde archivo o algo...
		
		
		HashMap<String, List<String>> list = new HashMap<String, List<String>>();
		        
        // Adding child data
        List<String> comidas = new ArrayList<String>();
        comidas.add("Aceite"); itemCost.put("Aceite", 2.0f);
        comidas.add("Arroz");  itemCost.put("Arroz", 2.0f);
        comidas.add("Leche");  itemCost.put("Leche", 2.0f);
        comidas.add("Ketchup");  itemCost.put("Ketchup", 2.0f);
        comidas.add("Mayonesa");  itemCost.put("Mayonesa", 2.0f);
        comidas.add("Aceitunas");  itemCost.put("Aceitunas", 2.0f);
        comidas.add("Fideos");  itemCost.put("Fideos", 2.0f);
 
        List<String> limpieza = new ArrayList<String>();
        limpieza.add("Detergente");  itemCost.put("Detergente", 2.0f);
        limpieza.add("Lavandina");  itemCost.put("Lavandina", 2.0f);
        limpieza.add("Esponja");  itemCost.put("Esponja", 2.0f);
        limpieza.add("Desinfectante");  itemCost.put("Desinfectante", 2.0f);
        limpieza.add("Desodorante");  itemCost.put("Desodorante", 2.0f);
        limpieza.add("Plumero");  itemCost.put("Plumero", 2.0f);
 
        List<String> golosinas = new ArrayList<String>();
        golosinas.add("Caramelo");  itemCost.put("Caramelo", 2.0f);
        golosinas.add("Chocolate");  itemCost.put("Chocolate", 2.0f);
        golosinas.add("Turron");  itemCost.put("Turron", 2.0f);
        golosinas.add("Pan dulce");  itemCost.put("Pan dulce", 2.0f);
        golosinas.add("Menta");  itemCost.put("Menta", 2.0f);
 
        List<String> juguetes = new ArrayList<String>();
        juguetes.add("Iron Man");  itemCost.put("Iron Man", 2.0f);
        juguetes.add("Hot Wheels");  itemCost.put("Hot Wheels", 2.0f);
        juguetes.add("Peluche");  itemCost.put("Peluche", 2.0f);
        
        List<String> libreria= new ArrayList<String>();
        libreria.add("Harry Potter");  itemCost.put("Harry Potter", 2.0f);
        libreria.add("Cuaderno");  itemCost.put("Cuaderno", 2.0f);
        libreria.add("Lapicera");  itemCost.put("Lapicera", 2.0f);
        libreria.add("Anotador");  itemCost.put("Anotador", 2.0f);
        
        
        list.put("Comidas", comidas);
        list.put("Limpieza", limpieza);
        list.put("Golosinas", golosinas);
        list.put("Juguetes", juguetes);
        list.put("Libreria", libreria);
		
		return list;
	}

	private HashMap<String, List<String>> getListFromServer() {
		//TEMPORAL, cargar desde server..
		/*//EJEMPLO CON MENOS ITEMS		
  		HashMap<String, List<String>> list = new HashMap<String, List<String>>();
        List<String> comidas = new ArrayList<String>();
        comidas.add("Levadura");
        itemCost.put("Levadura", 2.0f);
        list.put("Comidas", comidas);
        return list;*/
		
		//EJEMPLO CON MAS ITEMS
		HashMap<String, List<String>> savedList = savedList();
		savedList.put("Electronica", Arrays.asList("Xbox", "Led TV"));
		itemCost.put("Xbox", 2.0f);
		itemCost.put("Led TV", 2.0f);
		return savedList;
	}

   
	public List<String> getListHeaders(){
		return listDataHeader;
	}
	
	public HashMap<String, List<String>> getListChildren(){
		return listDataChild;
	}

	public HashMap<String, Integer> getItemStock() {
		return itemStock;
	}

	public float costOf(int row, int col) {
		return itemCost.get(getItemName(row, col));
	}

	public int stockOf(int row, int col) {
		return itemStock.get(getItemName(row, col));
	}

	public float totalCostOf(String name) {
		return itemCost.get(name)*itemStock.get(name);
	}

	private String getItemName(int row, int col) {
		return listDataChild.get(listDataHeader.get(row)).get(col);
	}
	
	public void addStockTo(int row, int col) {
		itemStock.put(getItemName(row, col), itemStock.get(getItemName(row, col))+1);
	}

	public void removeStockTo(int row, int col) {
		if(itemStock.get(getItemName(row, col)) > 0)
			itemStock.put(getItemName(row, col), itemStock.get(getItemName(row, col))-1);
	}


}
